package org.jaaksi.kottlindemo

import org.junit.Test

class Test1 {
    @Test
    fun test1() {
        val list = listOf(1, 2, 3, 5, 7)
        // {奇数=[1, 3, 5], 偶数=[2, 4]}
        println(list.groupBy {
            if (it % 2 == 0) "偶数" else "奇数"
        })

        // 创建一个指定长度的数组，并初始化
        val list2 = IntArray(3) { it }
        val list3 = Array(3) { it.toString() }
        list2.fill(0)
        val list1 = List(3) { it.toString() }

        repeat(3) { println(it.toString()) }

        list.lastIndexOf(2)
//        reduce：将所提供的操作应用于集合元素并返回积累的结果
//        fold和reduce是一样的。
//        主要的区别是：
//        fold接受一个初始值并将其用作第一步的积累值，而reduce的第一步则将第一个和第二个元素作为第一步的操作参数。
        list.reduce { acc, i ->
//            println("acc = $acc,i = $i")
            acc + i
        }

        list.fold(10) { acc, i ->
            println("acc = $acc,i = $i")
            acc + i
        }

        list.getOrNull(0)
        list.elementAtOrNull(0)

        // 排序
        list.sorted()
        list.sortedBy { it.toString().length }
        list.sortedWith(compareBy { it.toString().length })
        list.sortedWith { o1, o2 -> o1.toString().length - o2.toString().length }

    }

    @Test
    fun testSort() {
        val list = (1..5).map { Person(it, it) }

        // 先根据age字段，再根据Person
        list.sortedWith(compareBy(Person::age, Person::id))
    }

    data class Person(val age: Int, val id: Int)
}